package br.com.gip.business.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.com.gip.business.ArtefatoBusiness;
import br.com.gip.business.RelacionamentoBusiness;
import br.com.gip.exception.BusinessException;
import br.com.gip.repository.dao.ArtefatoDao;
import br.com.gip.repository.model.Artefato;
import br.com.gip.repository.model.Categoria;
import br.com.gip.repository.model.Projeto;

@Service
public class ArtefatoBusinessImpl implements ArtefatoBusiness {

	private static final long serialVersionUID = -2732680512471601799L;
	
	@Autowired
	private ArtefatoDao artefatoDao;

	@Autowired
	private RelacionamentoBusiness relacionamentoBusiness;
	
	@Override
	public void cadastrarArtefato(Artefato artefato) {
		if (artefato.getArtefatoId() == null) {
			boolean artefatoValido = this.buscarArtefatos(artefato.getNome(), null, artefato.getCategoria().getCategoriaId()).isEmpty();
			
			if (!artefatoValido) {
				throw new BusinessException("Artefato ja existente");
			}
		}
		
		this.artefatoDao.saveOrUpdate(artefato);
	}
	
	@Override
	public void atualizarArtefato(Artefato artefato) {
		this.artefatoDao.update(artefato);
	}

	@Override
	public Artefato bucarArtefato(String nome) {
		return this.artefatoDao.findByNome(nome);
	}

	@Override
	public Map<Categoria, List<Artefato>> buscarArtefatos(Projeto projeto) {
		Map<Categoria, List<Artefato>> map = new HashMap<Categoria, List<Artefato>>();
		
		for (Artefato artefato : this.artefatoDao.findByProjeto(projeto)) {
			if (map.containsKey(artefato.getCategoria())) {
				map.get(artefato.getCategoria()).add(artefato);
			} else {
				map.put(artefato.getCategoria(), new ArrayList<Artefato>(Arrays.asList(artefato)));
			}
		}
		
		return map;
	}

	@Override
	public List<Artefato> buscarArtefatos(String nome, Long projetoId, Long categoriaId) {
		return this.artefatoDao.findByFilter(nome, projetoId, categoriaId);
	}
	
	@Override
	public void removerArtefato(Artefato artefato) {
		this.relacionamentoBusiness.removerRelacionamentos(artefato);
		this.artefatoDao.delete(artefato);
	}

	@Override
	public boolean verificaRestricao(Artefato artefato) {
		boolean restrito = false;
		
		for(Artefato a : this.relacionamentoBusiness.buscarDependencias(artefato)) {
			if (!a.getProjeto().getProjetoId().equals(artefato.getProjeto().getProjetoId())) {
				restrito = true;
				break;
			}
		}
		
		return restrito;
	}

}
 